// Caclule la largeur d'un texte affiché par le moteur de rendu
String.prototype.width = function(font) {
	var f = font || '12px \"Lucida Grande\"',
		o = $('<div>' + this + '</div>')
			.css({'position': 'absolute', 'float': 'left', 'white-space': 'nowrap', 'visibility': 'hidden', 'font': f})
			.appendTo($('body')),
		w = o.width();
	o.remove();
	return w;
};

// Affiche un phylactère sous Mike contenant message durant delay (en secondes), et éventuellement joue audioFile
function mikeMessenger(message, delay, audioFile) {
	function shutUpMike() {
		$("#phylactere").fadeOut(400);
	}

	if (audioFile) {
		var sound = new Audio(audioFile);
		sound.play();
	}
	if ($("#phylactere").length > 0)
		$("#phylactere .phylactere-message").text(message);
	else
		$("body").append("<div id='phylactere' style='display: none;'><div class='phylactere-pointe'></div><div class='phylactere-message'>"+message+"</div></div>");
	var width = message.width() + parseInt($(".phylactere-message").css("padding"), 10)*3;
	$("#phylactere").css("width", (width<300 ? width : 300)+"px !important");
	$("#phylactere").fadeIn(400);
	
	var closeTimeout = window.setTimeout(function(){shutUpMike();}, delay*1000);
	$("#phylactere").click(function() {
		window.clearTimeout(closeTimeout);
		shutUpMike();
	});
}

// Disable ou enable le bouton sumbit des forms selon la validité des données
function checkFormsValids() {
	$("form").each(function() {
		if ($(this).get(0).querySelectorAll(':invalid').length > 0)
			$(this).find("input[type=\"submit\"]").attr('disabled','disabled');
		else
			$(this).find("input[type=\"submit\"]").removeAttr("disabled");
	});
}

/* Décrémente le timer, recharge la liste des joueurs et vérifie le status (partie annulée ou commencée)  */
function attendrePartie(partie_redirect) {
	window.setInterval(function(){
		var time = parseInt($("#timer").text(), 10);
		if (time > 0) time--;
		$("#timer").text(time);
	}, 1000);
	window.setInterval(function(){
		$.get("servlet_attente_partie.html", function(data, textStatus, jqXHR) {
			if (jqXHR.status == 290) {
				window.location.href = partie_redirect;
			} else if (jqXHR.status == 291) {
				mikeMessenger("Partie annul&eacute;e, vous allez &ecirc;tre exp&eacute;di&eacute; d'o&ugrave; vous &ecirc;tes venu.", 4);
				window.setTimeout(function() {
					window.location.href = "servlet_dashboard.html";
				}, 4000);
			} else {
				$("#joueurs").replaceWith($("#joueurs", data));
			}
		}, "html");
	}, 2000);
}

/* Teste si le tour est terminé ou la partie annulée et redirige en fonction  */
function attendreTour() {
	window.setInterval(function(){
		$.get("servlet_partie.html", function(data, textStatus, jqXHR) {
			mikeMessenger("servlet_tour.html renvoie status "+jqXHR.status, 1);
			if (jqXHR.status == 290) {
				window.location.href = "servlet_partie.html";
			} else if (jqXHR.status == 291) {
				mikeMessenger("Partie annul&eacute;e, vous allez &ecirc;tre exp&eacute;di&eacute; d'o&ugrave; vous &ecirc;tes venu.", 4);
				window.setTimeout(function() {
					window.location.href = "servlet_dashboard.html";
				}, 4000);
			}
		}, "html");
	}, 2000);
}

/* Recharge la liste des parties rejoignables  */
function reloadDashboard() {
	window.setInterval(function(){
		$.get("servlet_dashboard.html", function(data, textStatus, jqXHR) {
			var content = $("#content", data);
			if (content.length)
				$("#content").replaceWith($("#content", data));
			else // la session a probablement expiré
				 window.location.href = "index.html";
		}, "html");
	}, 2000);
}

/* Met en place le drag & drop des jetons */
function bindDragAndDrop() {
	$(".draggable").draggable({
		containment: "#content",
		distance: 20,
		revert: "invalid",
		revertDuration: 300
	}).css("position", "absolute");
	$(".droppable").droppable({
		drop: function(event, ui) {
			var numCase = parseInt($(this).attr("data-numero"), 10);
			var numJeton = parseInt(ui.draggable.text(), 10);
			$(this)
				.droppable( "disable" )
				.attr("class", "jetonActif")
				.text(numJeton);
			ui.draggable.css("opacity", 0);
			// Gérer la requête au serveur et la mise à jour de la page
			$.get("http://localhost:8080/Finito/servlet_partie.html?case="+numCase+"&jeton="+numJeton, function(data, textStatus, jqXHR) {
				var content = $("#content", data);
				if (content.length) {
					$("#content").replaceWith($("#content", data));
					bindDragAndDrop();
				} else { // la session a probablement expiré
					 window.location.href = "index.html";
				}
			});
			mikeMessenger("http://localhost:8080/Finito/servlet_partie.html?case="+numCase+"&jeton="+numJeton, 2);
		}
	});
	// changement de cursor
	$(".draggable").mousedown(function() { $(this).addClass("grabbed"); });
	$(".draggable").mouseup(function() { $(this).removeClass("grabbed"); });
}

// Page chargée
$(document).ready(function() {

	bindDragAndDrop();
	
	// Si il y a au moins un élément invalide dans un formulaire, son submit est disabled
	$("form").each(function() {
		checkFormsValids();
	});
	$("form :input").keyup(function() {
		checkFormsValids();
	});
	$("form :input").change(function() {
		checkFormsValids();
	});
});